package gebzebelediye_client;

import com.asprise.util.jtwain.JTwainException;
import com.asprise.util.jtwain.Source;
import com.asprise.util.jtwain.SourceManager;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.*;
import java.util.Properties;


import javax.imageio.ImageIO;

/**
 *
 * @author Hatice ŞAHİN <haticesahin.09@gmail.com>
 */
public class Gebzebelediye_client_1 {

    static boolean baglanti = false;
    static Socket skt;
    static String server;
    static int port_no;
    static String[] gelen_mesaj;
    static OutputStream os;

    public static void main(String[] args) {
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
        SourceManager.setLibraryPath(Parametre.SCANNER_LIBRARY);
        try {

            ayarlari_getir();
            System.out.println("Baglanti kuruldu");

            baglanti = true;
            PrintStream out = new PrintStream(skt.getOutputStream());
            os = skt.getOutputStream();

            while (baglanti) {
                BufferedReader in = new BufferedReader(new InputStreamReader(skt.getInputStream()));
                System.out.print("Serverdan blgi bekleniyor...");

                gelen_mesaj = in.readLine().split("-");


                if (gelen_mesaj[0].equals(skt.getInetAddress().toString())) {
                    System.out.println("gelen mesaj : " + gelen_mesaj[1]);
                    if ("p".equals(gelen_mesaj[1])) {
                        dosya_gonder();
                    } else {

                        System.out.print("Cikis icin 'q'ya basiniz veya servera gonderiecek giriniz: ");
                        String kull_girdisi = input.readLine();
                        out.println(kull_girdisi);

                        if ("q".equals(kull_girdisi)) {
                            baglanti = false;
                        }
                    }
                } else {
                    System.out.println("bize ait olmayan mesajlari okumamaliyiz...");
                }
            }
            skt.close();
            baglanti = false;
        } catch (Exception e) {
            System.out.println("Baglanti Kesildi!");
            System.out.println(e);
            baglanti = false;
        }
    }

    private static void ayarlari_getir() {
        try {
            Properties prop = new Properties();
            String fileName = Parametre.CLIENT_CONFIG_FILE_NAME;
            InputStream is = new FileInputStream(fileName);
            prop.load(is);
            server = prop.getProperty("server");
            port_no = Integer.parseInt(prop.getProperty("port_no"));
            skt = new Socket(server, port_no);
        } catch (IOException ex) {
            System.out.println("Config hatasi: " + ex);
        }
    }

    private static void dosya_gonder() {
        System.out.println("tarayici bilgisi karsiya gonderiliyor...");

        try {

            Source source = null;
            BufferedImage image = null;
            byte[] imageinBytes, artan_dizi;


            int k = 0, artan = 0;
            Integer boyut;

            try {
                source = SourceManager.instance().getDefaultSource();
            } catch (JTwainException ex) {
                System.out.println("Default source bulunamadi: " + ex);
            }
            try {
                source.open();
            } catch (JTwainException ex) {
                System.out.println("Source acilamadi: +ex");
            }
            System.out.println("cihaz acildi: " + source);


            try {
                image = source.acquireImageAsBufferedImage();
            } catch (JTwainException ex) {
                System.out.println("Tarayicidan okuma hatasi: " + ex);
            }

            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ImageIO.write(image, "jpg", bos);
            imageinBytes = bos.toByteArray();
            System.out.println("dosya boyutu: " + imageinBytes.length);


            boyut = imageinBytes.length;
            StringBuilder sb = new StringBuilder(boyut.toString());
            sb.append("\n");
            os.write(sb.toString().getBytes());



            int TamParcaSayisi = imageinBytes.length / Parametre.MAX_DATA_PARCA_BOYUTU;

            artan = imageinBytes.length % Parametre.MAX_DATA_PARCA_BOYUTU;
            artan_dizi = new byte[artan];
            byte[] parca = new byte[Parametre.MAX_PARCA_BOYUTU];

            for (int i = 0; i < (TamParcaSayisi); ++i) {
                k = 0;
                byte[] diziSirasi = convertIntTo32Bits(i);

                for (int j = 0; j < Parametre.PARCA_HEADER_SIZE; j++) {
                    parca[k++] = diziSirasi[j];

                }

                for (int j = i * Parametre.MAX_DATA_PARCA_BOYUTU; j < (Parametre.MAX_DATA_PARCA_BOYUTU * (i + 1)); j++) {

                    parca[k++] = imageinBytes[j];

                }
                System.out.println(i + 1 + ". cı parca, boyutu: " + parca.length);
                os.write(parca);
            }

            for (int a = (imageinBytes.length - artan); a < imageinBytes.length; a++) {
                artan_dizi[k] = imageinBytes[a];
                k++;
            }

            //   System.out.println(ofset + ". cı parca, boyutu: " + artan_dizi.length);
            os.write(artan_dizi);

        } catch (IOException e) {
            System.out.println(e);
        }
    }

    private static byte[] convertIntTo32Bits(int sayi) {
        byte[] retValue = new byte[Parametre.PARCA_HEADER_SIZE];
        return retValue;

    }
}
